package zju.dgm.service;

import org.apache.zookeeper.CreateMode;

import java.util.concurrent.CountDownLatch;

/**
 * @author lzy
 */
public abstract class ServiceEntry implements Runnable {


    public final CountDownLatch latch = new CountDownLatch(1);


    public boolean needRootPath() {
        return true;
    }

    /**
     * 如果需要路径来实现服务，就需要指定
     *
     * @return
     */
    public abstract String getRootPath();


    /**
     * 返回创建服务节点的创建模式
     *
     * @return
     */
    CreateMode getCreateMode() {
        return CreateMode.PERSISTENT;
    }


    /**
     * 这个方法决定了服务所依赖的其他服务，默认是不依赖任何服务
     *
     * @return 当前服务所依赖项（不一定是其他服务）提供的CountDownLatch数组
     */
    protected abstract CountDownLatch[] getPrerequisites();


    /**
     * 为该服务注册监听器，默认是没有监听器，但如果有监听器！！暂时！！只在这个方法内添加
     * <p>
     * 可以不使用 cacheManager获取监听器，因为可能需要灵活调整策略
     */
    abstract protected void registerListener();


    /**
     * 开启服务
     */
    abstract protected void start();


    /**
     * 执行服务的方法,所有服务都要严格按照执行服务的流程来run
     */
    @Override
    public final void run() {
        try {
            // 等待前置条件完成
            for (CountDownLatch countDownLatch : getPrerequisites()) {
                countDownLatch.await();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        registerListener(); // 注册监听器
        start();
    }


}
// 数据交互
// 负载均衡
// 查询处理
// 故障恢复
// 缓存



